home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / swirl / artshow.c next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  18.2 KB  |  752 lines

  1. /*
  2.  * Copyright 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <gl.h>
  18. #include <device.h>
  19. #include <math.h>
  20.  
  21. long RX = 300;
  22. long RY = 300;
  23.  
  24. #define PI 3.1415926535897
  25.  
  26. float *DX, *DY;
  27. unsigned char *R, *R1;
  28.  
  29. #define raster(i, j, c)        (*(R + (i*RY + j)*3 + c))
  30. #define raster1(i, j, c)    (*(R1 + (i*RY + j)*3 + c))
  31. #define dx(i, j)        (*(DX + (i*RY + j)))
  32. #define dy(i, j)        (*(DY + (i*RY + j)))
  33.  
  34. long ipattern = 0, idx = 0, idy = 0;
  35. long ipatternmax = 8, dmax = 26;
  36. float param1 = 1.0, param2 = 1.0;
  37. long generation = 0, stopped = 0;
  38. short dflag = 0;
  39.  
  40. void allocrasters()
  41. {
  42.     R = (unsigned char *)malloc(RX*RY*3);
  43.     R1 = (unsigned char *)malloc(RX*RY*3);
  44.     DX = (float *)malloc(RX*RY*sizeof(float));
  45.     DY = (float *)malloc(RX*RY*sizeof(float));
  46. }
  47.  
  48. void displayraster()
  49. {
  50.     long i, j, k, l, m;
  51.     char title[50], *halt;
  52.     
  53.     if (dflag == 0) {
  54.     for (i = 0; i < RX; i++)
  55.         for (j = 0; j < RY; j++) {
  56.         k = raster(i, j, 0);
  57.         l = raster(i, j, 1);
  58.         m = raster(i, j, 2);
  59.         RGBcolor(k, l, m);
  60.         pnt2i(i, j);
  61.         }
  62.     } else {
  63.     for (i = 0; i < RX; i++)
  64.         for (j = 0; j < RY; j++) {
  65.         k = raster1(i, j, 0);
  66.         l = raster1(i, j, 1);
  67.         m = raster1(i, j, 2);
  68.         RGBcolor(k, l, m);
  69.         pnt2i(i, j);
  70.         }
  71.     }
  72.     swapbuffers();
  73. }
  74.  
  75. void initraster()
  76. {
  77.     long i, j, k, i1, j1, i_1, j_1;
  78.     long th, sh;
  79.     float r, s, v[3], x1, y1;
  80.     unsigned long *lptr;
  81.     
  82.     switch (ipattern) {
  83.         default:
  84.     case -1:
  85.         sizeofimage("in.rgb",&RX, &RY);
  86.         allocrasters();
  87.         lptr = (unsigned long *)longimagedata("in.rgb");
  88.         for (j = 0; j < RY; j++) {
  89.         for (i = 0; i < RX; i++) {
  90.             int c = *lptr++;
  91.             raster(i, j, 0) = (c>>0)&0xff;
  92.             raster(i, j, 1) = (c>>8)&0xff;
  93.             raster(i, j, 2) = (c>>16)&0xff;
  94.         }
  95.         }
  96.         break;
  97.     case 0:
  98.         for (i = 0; i < RX; i++)
  99.         for (j = 0; j < RY; j++) {
  100.             raster(i, j, 0) = 0;
  101.             raster(i, j, 1) = 0;
  102.             raster(i, j, 2) = 0;
  103.         }
  104.         break;
  105.     case 1:
  106.         for (i = 0; i < RX; i++)
  107.         for (j = 0; j < RY; j++) {
  108.             raster(i, j, 0) = (i*5*255/(RX-1))&0xff;
  109.             raster(i, j, 1) = (i*5*255/(RX-1))&0xff;
  110.             raster(i, j, 2) = (i*5*255/(RX-1))&0xff;
  111.         }
  112.         break;
  113.     case 2:
  114.         for (i = 0; i < RX; i++)
  115.         for (j = 0; j < RY; j++) {
  116.             r = 60.0*((float)i)/(RX-1);
  117.             th = r;
  118.             if ((th % 5) == 0) i1 = 0; else i1 = 255;
  119.             raster(i, j, 0) = i1;
  120.             raster(i, j, 1) = i1;
  121.             raster(i, j, 2) = i1;
  122.         }
  123.         break;
  124.     case 3:
  125.         for (i = 0; i < RX; i++)
  126.         for (j = 0; j < RY; j++) {
  127.             r = 60.0*((float)i)/(RX-1);
  128.             th = r;
  129.             s = 60.0*((float)j)/(RY-1);
  130.             sh = s;
  131.             if (((sh % 5) == 0) ||((th % 5) == 0)) i1 = 0; else i1 = 255;
  132.             raster(i, j, 0) = i1;
  133.             raster(i, j, 1) = i1;
  134.             raster(i, j, 2) = i1;
  135.         }
  136.         break;
  137.     case 4:
  138.         for (i = 0; i < RX; i++)
  139.         for (j = 0; j < RY; j++) {
  140.             i1 = i-RX/2; j1 = j-RY/2;
  141.             raster(i, j, 0) = ((i1*i1+j1*j1)/50)&0xff;
  142.             raster(i, j, 1) = ((i1*i1+j1*j1)/45)&0xff;
  143.             raster(i, j, 2) = ((i1*i1+j1*j1)/70)&0xff;
  144.         }
  145.         break;
  146.     case 5:
  147.         for (i = 0; i < RX; i++)
  148.         for (j = 0; j < RY; j++) {
  149.             th = atan2((j-(RY-1)/2.0), (i-(RX-1)/2.0))*127.5/PI;
  150.             raster(i, j, 0) = (th)&0xff;
  151.             raster(i, j, 1) = (th+85)&0xff;
  152.             raster(i, j, 2) = (th+170)&0xff;
  153.         }
  154.         break;
  155.     case 6:
  156.         for (i = 0; i < RX; i++) {
  157.             v[0] = 126+126.0*cos((i*PI*10)/(RY-1));
  158.             v[1] = 126+126.0*cos((i*PI*8)/(RY-1));
  159.             v[2] = 126+126.0*cos((i*PI*2)/(RY-1));
  160.         for (j = 0; j < RY; j++) {
  161.             raster(i, j, 0) = v[0];
  162.             raster(i, j, 1) = v[1];
  163.             raster(i, j, 2) = v[2];
  164.         }
  165.         }
  166.         break;
  167.     case 7:
  168.         for (i = 0; i < RX; i++) {
  169.         for (j = 0; j < RY; j++) {
  170.             v[0] = 126+126.0*cos(((abs(i-RX/2)+abs(j-RY/2))*PI*10)/(RY+RX-2));
  171.             v[1] = 126+126.0*cos(((abs(i-RX/2)+abs(j-RY/2))*PI*8)/(RY+RX-2));
  172.             v[2] = 126+126.0*cos(((abs(i-RX/2)+abs(j-RY/2))*PI*2)/(RY+RX-2));
  173.             raster(i, j, 0) = v[0];
  174.             raster(i, j, 1) = v[1];
  175.             raster(i, j, 2) = v[2];
  176.         }
  177.         }
  178.         break;
  179.     case 8:
  180.         for (i = 0; i < RX; i++)
  181.         for (j = 0; j < RY; j++) {
  182.             raster(i, j, 0) = (i*255/(RX-1))&0xff;
  183.             raster(i, j, 1) = (j*255/(RX-1))&0xff;
  184.             raster(i, j, 2) = 0;
  185.         }
  186.         break;
  187.     }
  188.     switch (idx) {
  189.     default:
  190.     case 0:
  191.         for (i = 0; i < RX; i++)
  192.         for (j = 0; j < RY; j++) {
  193.             dx(i, j) = 0;
  194.         }
  195.         break;
  196.     case 1:
  197.         for (i = 0; i < RX; i++)
  198.         for (j = 0; j < RY; j++) {
  199.             dx(i, j) = param1*12*cos((j*PI*10*param2)/(RY-1));
  200.         }
  201.         break;
  202.     case 2:
  203.         for (i = 0; i < RX; i++)
  204.         for (j = 0; j < RY; j++) {
  205.             dx(i, j) = param1*12*cos((j*PI*4*param2)/(RY-1));
  206.         }
  207.         break;
  208.     case 3:
  209.         for (i = 0; i < RX; i++)
  210.         for (j = 0; j < RY; j++) {
  211.             dx(i, j) = param1*15*cos((j*PI*2*param2)/(RY-1));
  212.         }
  213.         break;
  214.     case 4:
  215.         for (i = 0; i < RX; i++)
  216.         for (j = 0; j < RY; j++) {
  217.             dx(i, j) = param1*8*cos((j*PI*4*param2)/(RY-1));
  218.         }
  219.         break;
  220.     case 5:
  221.         for (i = 0; i < RX; i++)
  222.         for (j = 0; j < RY; j++) {
  223.             dx(i, j) = param1*5*sin((j*PI*14*param2)/(RY-1));
  224.         }
  225.         break;
  226.     case 6:
  227.         for (i = 0; i < RX; i++)
  228.         for (j = 0; j < RY; j++) {
  229.             dx(i, j) = param1*15*sin((j*PI*param2)/(RY-1));
  230.         }
  231.         break;
  232.     case 7:
  233.         for (i = 0; i < RX; i++)
  234.         for (j = 0; j < RY; j++) {
  235.             dx(i, j) = param1*(float)j/30;
  236.         }
  237.         break;
  238.     case 8:
  239.         for (i = 0; i < RX; i++)
  240.         for (j = 0; j < RY; j++) {
  241.             dx(i, j) = param1*5*sin((j*PI*14)/(RY-1))*cos((i*PI*2*param2)/(RX-1));
  242.         }
  243.         break;
  244.     case 9:
  245.         for (i = 0; i < RX; i++)
  246.         for (j = 0; j < RY; j++) {
  247.             dx(i, j) = (((rand())>>5)&0x1f) - 16;
  248.         }
  249.         for (k = 0; k < 4; k++)
  250.         for (i = 0; i < RX; i++)
  251.             for (j = 0; j < RY; j++) {
  252.             i1 = i+1; j1 = j+1;
  253.             i_1 = i-1; j_1 = j-1;
  254.             if (i1 == RX) i1 = 0;
  255.             if (j1 == RY) j1 = 0;
  256.             if (i_1 == -1) i1 = RX-1;
  257.             if (j_1 == -1) j1 = RY-1;
  258.             dx(i, j) = (4*(dx(i, j)) + dx(i1, j1) + dx(i_1, j1) +
  259.                     dx(i_1, j_1) + dx(i1, j_1) + 2*(dx(i, j1) +
  260.                     dx(i, j_1) + dx(i1, j) + dx(i_1, j)))/16.0;
  261.             }
  262.         break;
  263.     case 10:
  264.         for (i = 0; i < RX; i++)
  265.         for (j = 0; j < RY; j++) {
  266.             dx(i, j) = param1*8*cos((j*PI*10*param2)/(RY-1));
  267.         }
  268.         break;
  269.     case 11:
  270.         for (i = 0; i < RX; i++)
  271.         for (j = 0; j < RY; j++) {
  272.             x1 = -1.0 + 2.0*i/(RX-1);
  273.             y1 = -1.0 + 2.0*j/(RY-1);
  274.             dx(i, j) = 12.0*(x1*x1-y1*y1) + param1;
  275.         }
  276.         break;
  277.     case 12:
  278.         for (i = 0; i < RX; i++)
  279.         for (j = 0; j < RY; j++) {
  280.             x1 = -1.0 + 2.0*i/(RX-1);
  281.             y1 = -1.0 + 2.0*j/(RY-1);
  282.             r = x1*x1+y1*y1;
  283.             dx(i, j) = -param1*8.0*y1/(1.0+r*r);
  284.         }
  285.         break;
  286.     case 13:
  287.         for (i = 0; i < RX; i++)
  288.         for (j = 0; j < RY; j++) {
  289.             x1 = -1.0 + 2.0*i/(RX-1);
  290.             y1 = -1.0 + 2.0*j/(RY-1);
  291.             r = x1*x1+y1*y1;
  292.             dx(i, j) = -param1*8.0*x1/(1.0+r*r);
  293.         }
  294.         break;
  295.     case 14:
  296.         for (i = 0; i < RX; i++)
  297.         for (j = 0; j < RY; j++) {
  298.             x1 = -1.0 + 2.0*i/(RX-1);
  299.             y1 = -1.0 + 2.0*j/(RY-1);
  300.             r = x1*x1+y1*y1;
  301.             dx(i, j) = param1*8.0*x1/(1.0+r*r);
  302.         }
  303.         break;
  304.     case 15:
  305.         for (i = 0; i < RX; i++)
  306.         for (j = 0; j < RY; j++) {
  307.             x1 = -1.0 + 2.0*i/(RX-1)-0.5;
  308.             y1 = -1.0 + 2.0*j/(RY-1);
  309.             r = x1*x1+y1*y1;
  310.             dx(i, j) = param1*7.0*(x1)/(1.0+r*r);
  311.             x1 = -1.0 + 2.0*i/(RX-1)+0.5;
  312.             y1 = -1.0 + 2.0*j/(RY-1);
  313.             r = x1*x1+y1*y1;
  314.             dx(i, j) -= param1*7.0*(x1)/(1.0+r*r);
  315.         }
  316.         break;
  317.     case 16:
  318.         for (i = 0; i < RX; i++)
  319.         for (j = 0; j < RY; j++) {
  320.             x1 = -1.0 + 2.0*i/(RX-1);
  321.             y1 = -1.0 + 2.0*j/(RY-1);
  322.             r = x1*x1+y1*y1;
  323.             dx(i, j) = -param1*8*y1/(.5+r) +x1*3;
  324.         }
  325.         break;
  326.     case 17:
  327.         for (i = 0; i < RX; i++)
  328.         for (j = 0; j < RY; j++) {
  329.             dx(i, j) = param1*5*sin((j*PI*14)/(RY-1))+cos((i*PI*2*param2)/(RX-1));
  330.         }
  331.         break;
  332.     case 18:
  333.         for (i = 0; i < RX; i++)
  334.         for (j = 0; j < RY; j++) {
  335.             x1 = -1.0 + 2.0*i/(RX-1);
  336.             y1 = -1.0 + 2.0*j/(RY-1);
  337.             r = x1*x1+y1*y1;
  338.             dx(i, j) = param1*8.0*x1/(1.0+r)*cos(20*r);
  339.         }
  340.         break;
  341.     case 19:
  342.         for (i = 0; i < RX; i++)
  343.         for (j = 0; j < RY; j++) {
  344.             x1 = -1.0 + 2.0*i/(RX-1);
  345.             y1 = -1.0 + 2.0*j/(RY-1);
  346.             dx(i, j) = param1*8.0*(x1*x1-y1*y1);
  347.         }
  348.         break;
  349.     case 20:
  350.         for (i = 0; i < RX; i++)
  351.         for (j = 0; j < RY; j++) {
  352.             x1 = -1.0 + 2.0*i/(RX-1);
  353.             y1 = -1.0 + 2.0*j/(RY-1);
  354.             x1 *= param2; y1 *= param2;
  355.             dx(i, j) = param1*8.0*exp(x1)*cos(5*y1);
  356.         }
  357.         break;
  358.     case 21:
  359.         for (i = 0; i < RX; i++)
  360.         for (j = 0; j < RY; j++) {
  361.             x1 = -1.0 + 2.0*i/(RX-1);
  362.             y1 = -1.0 + 2.0*j/(RY-1);
  363.             dx(i, j) = -param1*8.0*(cos(4*PI*(x1-y1)));
  364.         }
  365.         break;
  366.     case 22:
  367.         for (i = 0; i < RX; i++)
  368.         for (j = 0; j < RY; j++) {
  369.             x1 = -1.0 + 2.0*i/(RX-1);
  370.             y1 = -1.0 + 2.0*j/(RY-1);
  371.             dx(i, j) = -param1*8.0/(1.3+cos(4*PI*(x1-y1)));
  372.         }
  373.         break;
  374.     case 23:
  375.         for (i = 0; i < RX; i++)
  376.         for (j = 0; j < RY; j++) {
  377.             x1 = -1.0 + 2.0*i/(RX-1);
  378.             y1 = -1.0 + 2.0*j/(RY-1);
  379.             dx(i, j) = -param1*8.0*(cos(param2*4*PI*(y1*y1)));
  380.         }
  381.         break;
  382.     case 24:
  383.         for (i = 0; i < RX; i++)
  384.         for (j = 0; j < RY; j++) {
  385.             x1 = -1.0 + 2.0*i/(RX-1);
  386.             y1 = -1.0 + 2.0*j/(RY-1);
  387.             dx(i, j) = -param1*8.0*(cos(param2*4*PI*(y1*y1-x1*x1)));
  388.         }
  389.         break;
  390.     case 25:
  391.         for (i = 0; i < RX; i++)
  392.         for (j = 0; j < RY; j++) {
  393.             x1 = -1.0 + 2.0*i/(RX-1);
  394.             y1 = -1.0 + 2.0*j/(RY-1);
  395.             dx(i, j) = -param1*12.0*x1*(cos(param2*4*PI*(y1)));
  396.         }
  397.         break;
  398.     case 26:
  399.         for (i = 0; i < RX; i++)
  400.         for (j = 0; j < RY; j++) {
  401.             x1 = -1.0 + 2.0*i/(RX-1);
  402.             y1 = -1.0 + 2.0*j/(RY-1);
  403.             dx(i, j) = -param1*15.0*x1*x1*(cos(param2*4*PI*(y1)));
  404.         }
  405.         break;
  406.     }
  407.     switch (idy) {
  408.     default:
  409.     case 0:
  410.         for (i = 0; i < RX; i++)
  411.         for (j = 0; j < RY; j++) {
  412.             dy(i, j) = 0;
  413.         }
  414.         break;
  415.     case 1:
  416.         for (i = 0; i < RX; i++)
  417.         for (j = 0; j < RY; j++) {
  418.             dy(i, j) = param1*12*cos((i*PI*10*param2)/(RX-1));
  419.         }
  420.         break;
  421.     case 2:
  422.         for (i = 0; i < RX; i++)
  423.         for (j = 0; j < RY; j++) {
  424.             dy(i, j) = param1*12*cos((i*PI*4*param2)/(RX-1));
  425.         }
  426.         break;
  427.     case 3:
  428.         for (i = 0; i < RX; i++)
  429.         for (j = 0; j < RY; j++) {
  430.             dy(i, j) = param1*15*cos((i*PI*2*param2)/(RX-1));
  431.         }
  432.         break;
  433.     case 4:
  434.         for (i = 0; i < RX; i++)
  435.         for (j = 0; j < RY; j++) {
  436.             dy(i, j) = param1*8*cos((i*PI*4*param2)/(RX-1));
  437.         }
  438.         break;
  439.     case 5:
  440.         for (i = 0; i < RX; i++)
  441.         for (j = 0; j < RY; j++) {
  442.             dy(i, j) = param1*5*sin((i*PI*14*param2)/(RX-1));
  443.         }
  444.         break;
  445.     case 6:
  446.         for (i = 0; i < RX; i++)
  447.         for (j = 0; j < RY; j++) {
  448.             dy(i, j) = param1*15*sin((i*PI*param2)/(RX-1));
  449.         }
  450.         break;
  451.     case 7:
  452.         for (i = 0; i < RX; i++)
  453.         for (j = 0; j < RY; j++) {
  454.             dy(i, j) = param1*(float)i/30;
  455.         }
  456.         break;
  457.     case 8:
  458.         for (i = 0; i < RX; i++)
  459.         for (j = 0; j < RY; j++) {
  460.             dy(i, j) = param1*5*sin((i*PI*14)/(RX-1))*cos((j*PI*2*param2)/(RY-1));
  461.         }
  462.         break;
  463.     case 9:
  464.         for (i = 0; i < RX; i++)
  465.         for (j = 0; j < RY; j++) {
  466.             dy(i, j) = (((rand())>>5)&0x1f) - 16;
  467.         }
  468.         for (k = 0; k < 4; k++)
  469.         for (i = 0; i < RX; i++)
  470.             for (j = 0; j < RY; j++) {
  471.             i1 = i+1; j1 = j+1;
  472.             i_1 = i-1; j_1 = j-1;
  473.             if (i1 == RX) i1 = 0;
  474.             if (j1 == RY) j1 = 0;
  475.             if (i_1 == -1) i1 = RX-1;
  476.             if (j_1 == -1) j1 = RY-1;
  477.             dy(i, j) = (4*dy(i, j) + dy(i1, j1) + dy(i_1, j1) +
  478.                     dy(i_1, j_1) + dy(i1, j_1) + 2*(dy(i, j1) +
  479.                     dy(i, j_1) + dy(i1, j) + dy(i_1, j)))/16.0;
  480.             }
  481.         break;
  482.     case 10:
  483.         for (i = 0; i < RX; i++)
  484.         for (j = 0; j < RY; j++) {
  485.             dy(i, j) = param1*8*cos((i*PI*10*param2)/(RX-1));
  486.         }
  487.         break;
  488.     case 11:
  489.         for (i = 0; i < RX; i++)
  490.         for (j = 0; j < RY; j++) {
  491.             x1 = -1.0 + 2.0*i/(RX-1);
  492.             y1 = -1.0 + 2.0*j/(RY-1);
  493.             dy(i, j) = 12.0*x1*y1 + param2;
  494.         }
  495.         break;
  496.     case 12:
  497.         for (i = 0; i < RX; i++)
  498.         for (j = 0; j < RY; j++) {
  499.             x1 = -1.0 + 2.0*i/(RX-1);
  500.             y1 = -1.0 + 2.0*j/(RY-1);
  501.             r = x1*x1+y1*y1;
  502.             dy(i, j) = param1*8*x1/(1.0+r*r);
  503.         }
  504.         break;
  505.     case 13:
  506.         for (i = 0; i < RX; i++)
  507.         for (j = 0; j < RY; j++) {
  508.             x1 = -1.0 + 2.0*i/(RX-1);
  509.             y1 = -1.0 + 2.0*j/(RY-1);
  510.             r = x1*x1+y1*y1;
  511.             dy(i, j) = -param1*8.0*y1/(1.0+r*r);
  512.         }
  513.         break;
  514.     case 14:
  515.         for (i = 0; i < RX; i++)
  516.         for (j = 0; j < RY; j++) {
  517.             x1 = -1.0 + 2.0*i/(RX-1);
  518.             y1 = -1.0 + 2.0*j/(RY-1);
  519.             r = x1*x1+y1*y1;
  520.             dy(i, j) = param1*8.0*y1/(1.0+r*r);
  521.         }
  522.         break;
  523.     case 15:
  524.         for (i = 0; i < RX; i++)
  525.         for (j = 0; j < RY; j++) {
  526.             x1 = -1.0 + 2.0*i/(RX-1)-0.5;
  527.             y1 = -1.0 + 2.0*j/(RY-1);
  528.             r = x1*x1+y1*y1;
  529.             dy(i, j) = param1*7.0*y1/(1.0+r*r);
  530.             x1 = -1.0 + 2.0*i/(RX-1)+0.5;
  531.             y1 = -1.0 + 2.0*j/(RY-1);
  532.             r = x1*x1+y1*y1;
  533.             dy(i, j) -= param1*7.0*(y1)/(1.0+r*r);
  534.         }
  535.         break;
  536.     case 16:
  537.         for (i = 0; i < RX; i++)
  538.         for (j = 0; j < RY; j++) {
  539.             x1 = -1.0 + 2.0*i/(RX-1);
  540.             y1 = -1.0 + 2.0*j/(RY-1);
  541.             r = x1*x1+y1*y1;
  542.             dy(i, j) = param1*8*x1/(0.5+r) +y1*3;
  543.         }
  544.         break;
  545.     case 17:
  546.         for (i = 0; i < RX; i++)
  547.         for (j = 0; j < RY; j++) {
  548.             dy(i, j) = param1*5*sin((i*PI*14)/(RX-1))+cos((j*PI*2*param2)/(RY-1));
  549.         }
  550.         break;
  551.     case 18:
  552.         for (i = 0; i < RX; i++)
  553.         for (j = 0; j < RY; j++) {
  554.             x1 = -1.0 + 2.0*i/(RX-1);
  555.             y1 = -1.0 + 2.0*j/(RY-1);
  556.             r = x1*x1+y1*y1;
  557.             dy(i, j) = param1*8.0*y1/(1.0+r)*cos(20*r);
  558.         }
  559.         break;
  560.     case 19:
  561.         for (i = 0; i < RX; i++)
  562.         for (j = 0; j < RY; j++) {
  563.             x1 = -1.0 + 2.0*i/(RX-1);
  564.             y1 = -1.0 + 2.0*j/(RY-1);
  565.             dy(i, j) = param1*8.0*x1*y1;
  566.         }
  567.         break;
  568.     case 20:
  569.         for (i = 0; i < RX; i++)
  570.         for (j = 0; j < RY; j++) {
  571.             x1 = -1.0 + 2.0*i/(RX-1);
  572.             y1 = -1.0 + 2.0*j/(RY-1);
  573.             x1 *= param2; y1 *= param2;
  574.             dy(i, j) = param1*8.0*exp(x1)*sin(5*y1);
  575.         }
  576.         break;
  577.     case 21:
  578.         for (i = 0; i < RX; i++)
  579.         for (j = 0; j < RY; j++) {
  580.             x1 = -1.0 + 2.0*i/(RX-1);
  581.             y1 = -1.0 + 2.0*j/(RY-1);
  582.             dy(i, j) = -param2*8.0*(cos(4*PI*(x1+y1)));
  583.         }
  584.         break;
  585.     case 22:
  586.         for (i = 0; i < RX; i++)
  587.         for (j = 0; j < RY; j++) {
  588.             x1 = -1.0 + 2.0*i/(RX-1);
  589.             y1 = -1.0 + 2.0*j/(RY-1);
  590.             dy(i, j) = -param2*8.0/(1.3+cos(4*PI*(x1+y1)));
  591.         }
  592.         break;
  593.     case 23:
  594.         for (i = 0; i < RX; i++)
  595.         for (j = 0; j < RY; j++) {
  596.             x1 = -1.0 + 2.0*i/(RX-1);
  597.             y1 = -1.0 + 2.0*j/(RY-1);
  598.             dy(i, j) = -param1*8.0*(cos(param2*4*PI*(x1*x1)));
  599.         }
  600.         break;
  601.     case 24:
  602.         for (i = 0; i < RX; i++)
  603.         for (j = 0; j < RY; j++) {
  604.             x1 = -1.0 + 2.0*i/(RX-1);
  605.             y1 = -1.0 + 2.0*j/(RY-1);
  606.             dy(i, j) = -param1*8.0*(cos(param2*4*PI*(x1*x1*x1)));
  607.         }
  608.         break;
  609.     case 25:
  610.         for (i = 0; i < RX; i++)
  611.         for (j = 0; j < RY; j++) {
  612.             x1 = -1.0 + 2.0*i/(RX-1);
  613.             y1 = -1.0 + 2.0*j/(RY-1);
  614.             dy(i, j) = -param1*12.0*y1*(cos(param2*4*PI*(x1)));
  615.         }
  616.         break;
  617.     case 26:
  618.         for (i = 0; i < RX; i++)
  619.         for (j = 0; j < RY; j++) {
  620.             x1 = -1.0 + 2.0*i/(RX-1);
  621.             y1 = -1.0 + 2.0*j/(RY-1);
  622.             dy(i, j) = -param1*15.0*y1*y1*(cos(param2*4*PI*(x1)));
  623.         }
  624.         break;
  625.     }
  626. }
  627.  
  628. void iterate(unsigned char *R, unsigned char *R1)
  629. {
  630.     long i, j, k;
  631.     float i1, j1;
  632.     long ifl, jfl, ifl1, jfl1, ifl2, jfl2;
  633.     float ifr, jfr;
  634.     
  635.     generation++;
  636.     for (i = 0; i < RX; i++)
  637.     for (j = 0; j < RY; j++) {
  638.         i1 = dx(i, j); j1 = dy(i, j);
  639.         ifl = floor(i1); jfl = floor(j1);
  640.         ifr = i1 - ifl; jfr = j1 - jfl;
  641.         ifl1 = ifl+i; jfl1 = jfl+j;
  642.         ifl2 = ifl1+1; jfl2 = jfl1+1;
  643.         while (ifl1 >= RX) ifl1 -= RX;
  644.         while (jfl1 >= RY) jfl1 -= RY;
  645.         while (ifl2 >= RX) ifl2 -= RX;
  646.         while (jfl2 >= RY) jfl2 -= RY;
  647.         while (ifl1 < 0) ifl1 += RX;
  648.         while (jfl1 < 0) jfl1 += RY;
  649.         while (ifl2 < 0) ifl2 += RX;
  650.         while (jfl2 < 0) jfl2 += RY;
  651.         for (k = 0; k < 3; k++)
  652.             raster1(i, j, k) = raster(ifl1, jfl1, k)*(1.0-ifr)*(1.0-jfr) +
  653.                 raster(ifl2, jfl1, k)*(ifr)*(1.0-jfr) +
  654.                 raster(ifl1, jfl2, k)*(1.0-ifr)*(jfr) +
  655.                 raster(ifl2, jfl2, k)*(ifr)*(jfr);
  656.     }
  657.     if (ipattern == 0)
  658.     for (i = RX/2-5; i < RX/2+5; i++)
  659.         for (j = RY/2-5; j < RY/2+5; j++)
  660.         raster1(i, j, 0) = raster1(i, j, 1) = raster1(i, j, 2) = 255;
  661. }
  662.  
  663. void printdata()
  664. {
  665.     long i, j;
  666.     
  667.     printf("unsigned char reddata[%d][%d] = {\n", RX, RY);
  668.     for (j = 0; j < RY; j++) {
  669.         printf("{");
  670.     for (i = 0; i < RX; i++) {
  671.         printf("0x%2.2x,", raster(i, j, 0));
  672.     }
  673.     printf("},\n");
  674.     }
  675.     printf("};\n");
  676.     printf("unsigned char greendata[%d][%d] = {\n", RX, RY);
  677.     for (j = 0; j < RY; j++) {
  678.         printf("{");
  679.     for (i = 0; i < RX; i++) {
  680.         printf("0x%2.2x,", raster(i, j, 1));
  681.     }
  682.     printf("},\n");
  683.     }
  684.     printf("};\n");
  685.     printf("unsigned char bluedata[%d][%d] = {\n", RX, RY);
  686.     for (j = 0; j < RY; j++) {
  687.         printf("{");
  688.     for (i = 0; i < RX; i++) {
  689.         printf("0x%2.2x,", raster(i, j, 2));
  690.     }
  691.     printf("},\n");
  692.     }
  693.     printf("};\n");
  694. }
  695.  
  696. float showdata[][6] = { /* last # must be even */
  697.     {5, 1, 3, .5, 2, 30}, 
  698.     {1, 8, 8, 1, 1, 24}, 
  699.     {7, 8, 8, 1, 1, 20},
  700.     {1, 1, 5, 1, 1, 24}, 
  701.     {4, 6, 19, 1, 1, 46},
  702.     {6, 2, 11, 1, 1, 30}, 
  703.     {4, 17, 17, 1, 1, 20}, 
  704.     {5, 22, 27, 1, 1, 40}, 
  705. };
  706.  
  707. long showlength = 8;
  708.  
  709. main(int argc, char **argv)
  710. {
  711.     short val, i, j, maxiter, iter;
  712.     long showno = showlength-1;
  713.  
  714.     prefsize(RX, RY);
  715.     winopen("artshow");
  716.     RGBmode();
  717.     doublebuffer();
  718.     gconfig();
  719.     allocrasters();
  720.     while (1) {
  721.     iter = 0;
  722.     showno++;
  723.     if (showno == showlength) showno = 0;
  724.     ipattern = showdata[showno][0];
  725.     idx = showdata[showno][1];
  726.     idy = showdata[showno][2];
  727.     param1 = showdata[showno][3];
  728.     param2 = showdata[showno][4];
  729.     maxiter = showdata[showno][5];
  730.     initraster();
  731.     displayraster();
  732.     while (1) {
  733.         while (qtest()) switch(qread(&val)) {
  734.         case REDRAW:
  735.             displayraster();
  736.             break;
  737.         default:
  738.             break;
  739.         }
  740.         if (stopped == 0) {
  741.         if (dflag == 0)
  742.             iterate(R, R1);
  743.         else
  744.             iterate(R1, R);
  745.         if (iter++ == maxiter) break;
  746.         dflag = 1 - dflag;
  747.         displayraster();
  748.         } else sginap(5);
  749.     }
  750.     }
  751. }
  752.